home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
printing
/
printque.arc
/
PRINTQUE.S
next >
Wrap
Text File
|
1987-04-26
|
8KB
|
201 lines
; . . .
;
; PRINT QUEUE for the Atari ST rev - 4/ 9/87
; rev 0.9 4/26/87
; Copyright (C) 1987 by Wayne S. Arczynski
; All rights reserved
; Equates
trap13: equ $B4 ; Bios trap vector location
hwint: equ $100 ; MFP Vector
; __________________________
Even ; get on even address
pbegin:
start:
lea stack,SP ; set stack pointer
bsr.l commercial ; do commercial
moveq #0,D0
move.w D0,inptr ; set buffer pointers
move.w D0,outptr
clr.l -(SP)
move.w #$20,-(SP) ; goto SUPERVISOR mode
trap #1
addq.l #6,SP
SUPER: lea $FF8800,A0 ; GI Sound chip
move.w SR,-(SP) ; Save SR
or.w #$700,SR ; disable int's
move.b #7,(A0) ; select reg 7
move.b (A0),D1 ; get old reg value
or.b #$80,D1 ; Set Port B to output
move.b D1,2(A0) ; rewrite reg
move.w (SP)+,SR ; restore int's
move.l trap13,A0 ; get old trap vector
cmp.l #'WsA0',-4(A0) ; Check test
beq.s abort ; Already installed?
move.l A0,otrap13 ; No. Install it
move.l #inque,trap13 ; point to new trap vector
move.l #outque,hwint ; point to new interrupt handler
moveq #0,D1
bclr D1,$FFFA03 ; BUSY falling edge, AER
bset D1,$FFFA15 ; Interrupt mask reg
bclr D1,$FFFA11 ; Interrupt In-Service Register
bset D1,$FFFA09 ; Enable interrupts
move.l D0,-(SP) ; Old SSP
move.w #$20,-(SP) ; leave SUPERVISOR mode
trap #1
addq.l #6,SP
done:
move.w #0,-(SP) ; no error
move.l #pend-pbegin,-(SP) ; program size with buffer
move.w #$31,-(SP) ; terminate and stay resident
trap #1 ; call gem
abort: move.l D0,-(SP) ; Old SSP
move.w #$20,-(SP) ; leave SUPERVISOR mode
trap #1
addq.l #6,SP
clr.w -(SP) ; Terminate & free memory
trap #1 ; call gem
commercial:
move.l #text,-(SP) ; put text address on stack
move.w #9,-(SP) ; PRINT LINE function code
trap #1 ; call gem
addq.l #6,SP ; Correct stack pointer
move.l #$100000,D2 ; wait a bit
pause: subq.l #1,D2
bne.s pause
rts
text: dc.b $1B,$45,$0D,$0A,$0D,$0A
dc.b 'Print Queue (C) 1987 by WSA',$0D,$0A
dc.b 'Shareware... Send $5 to:'
dc.b $0D,$0A,$0D,$0A
dc.b 'Wayne S. Arczynski',$0D,$0A
dc.b '8646 Chelsea Bridge Way',$0D,$0A
dc.b 'Lutherville, MD 21093',$0D,$0A
dc.b $0D,$0A,$0D,$0A
dc.b 0
; done main
Even ; get on even address
dc.l inptr-inque ; bfr ptr offset
dc.l 'WsA0' ; Test-word & Rev #
inque: move.l otrap13(PC),A1
move USP,A0 ; assume USER called
btst #13,(SP) ; Test old SR SUPER bit
beq.s skp1 ; User mode?
move.l SP,A0 ; No. Move SSP to A0
addq.l #6,A0 ; Correct A0
skp1: move.w (A0)+,D0 ; BIOS Function #
move.w (A0)+,D1 ; Device #
beq.s skp2 ; right device?
jmp (A1) ; No. Goto BIOS
skp2: cmp.w #3,D0 ; BCONOUT?
beq.s bcnout ; Yes. Doit.
cmp.w #8,D0 ; BCOSTAT?
beq.s bcnstat ; Yes. Doit.
jmp (A1) ; Not us. Goto BIOS.
bcnstat: moveq #-1,D0 ; assume ready.
move.w inptr(PC),D1
addq.w #1,D1 ; test add to inptr
cmp.w outptr(PC),D1 ; Buffer test
bne.s ok ; Buffer Full?
moveq #0,D0 ; Yes. Not ready.
ok: rte ; done... bcnstat
bcnout: move.w (A0),D1 ; Put Output char in D1
moveq #0,D0 ; Clear D0.L
move.w inptr(PC),D0 ; inptr
cmp.w outptr(PC),D0 ; outptr
bne.s skp3 ; Buffer Empty?
btst #0,$FFFA01 ; Yes. Centronics BUSY
bne.s skp3 ; Printer Busy?
; No. Print Char
lea $FF8800,A0 ; GI Sound chip
or.w #$700,SR ; disable int's
move.b #15,(A0) ; select port B
move.b D1,2(A0) ; write char
move.b #14,(A0) ; select port A
move.b (A0),D1 ; get old reg value
or.b #$20,D1
move.b D1,2(A0) ; Strobe high
and.b #$DF,D1
move.b D1,2(A0) ; Strobe low
moveq #-1,D0 ; No Error
rte
skp3: addq.w #1,D0 ; Increment inptr (D0)
cmp.w outptr(PC),D0 ; Buffer full?
bne.s skp4 ; No. Continue.
move.l $4BA,D2 ; Get 200hz timestamp
add.l #1000,D2 ; Add 5 sec's
loop: cmp.w outptr(PC),D0 ; Buffer full?
bne.s skp4 ; No. Continue.
cmp.l $4BA,D2 ; 5 sec's up?
bne.s loop ; No. loop
moveq #0,D0 ; Yes. Error out.
rte
skp4: subq.w #1,D0 ; correct D0
lea bfrstrt(PC),A0 ; buffer base addr
move.b D1,(A0,D0.l) ; put char in bfr
addq.w #1,inptr ; update inptr
moveq #-1,D0 ; No Error
rte ; done... bcnout
outque: movem.l D0-D1/A0,-(SP) ; Save reg's
lea bfrstrt(PC),A0 ; base in A0
moveq #0,D0 ; Clear D0
move.w outptr(PC),D0
cmp.w inptr(PC),D0
beq.s endint ; Buffer empty?
move.b (A0,D0.l),D1 ; get char from buffer
addq.w #1,outptr ; update output pointer
; Print char
lea $FF8800,A0 ; GI Sound chip
or.w #$700,SR ; disable int's
move.b #15,(A0) ; select port B
move.b D1,2(A0) ; write char
move.b #14,(A0) ; select port A
move.b (A0),D1 ; get old reg value
or.b #$20,D1
move.b D1,2(A0) ; Strobe high
and.b #$DF,D1
move.b D1,2(A0) ; Strobe low
endint: bclr #0,$FFFA11 ; Interrupt In-Service Register
movem.l (SP)+,D0-D1/A0 ; Pop reg's
rte
; Vars
otrap13: dc.l 0 ; Put old trap13 vector here
inptr: dc.w 0 ; Input buffer ptr
outptr: dc.w 0 ; Output buffer ptr
; output buffer
bfrstrt: equ outptr+2 ; 64K Buffer
bfrend: equ bfrstrt+65536
pend: equ bfrend+2
; 1K Stack (But only need 6 bytes)
stack: equ pend+1024 ; Initial USP